#include <mmu/mmu.h>
#include <mmu/physical.h>
#include <mmu/paging.h>
#include <driver/video.h>
#include <klibc/stdio.h>
 
/*
 * Funzione chiamata per i page fault
 */
void pagefault_handler(int us, int rw, int p)
{
	u_int32 adr;

	video_set_attr(VIDEO_RED_BLACK);
	printf("Pagefault: ");

	/*
	Bit 0 (P) is the Present flag.
	Bit 1 (R/W) is the Read/Write flag.
	Bit 2 (U/S) is the User/Supervisor flag.
	*/
	asm("mov %%cr2, %0" : "=r" (adr));

	if(us == 0) printf("Supervisory process ");
	else printf("User process ");

	if(rw == 0) printf("tried to read ");
	else printf("tried to write ");

	if(p == 0) printf("a non-present page entry ");
	else printf("a page and caused a protection fault ");
		
	// L'indirizzo
	printf(" at %d\n",adr);
}



/*
 * Inizializza la paginazione
 */
void paging_init()
{
	
	//asm (" 	mov %eax, page_dir\n 	\
		mov %cr3, %eax\n		\
		mov %eax, %cr0\n		\
		or %eax, $0x80000000\n	\
		mov %cr0, %eax\n		");
	


}


/*
 * Restituisce un indirizzo fisico da un indirizzo virtuale
 */
void *paging_get_phy(void *virtual)
{


}

/*
 * Mappa un indirizzo virtuale ad uno fisico
 */
void *paging_map(void *physical, unsigned flags)
{


}


/*
 * Cancella la mappa di indirizzo virtuale
 */
void paging_unmap(void *virtual)
{


}


